[小ネタ]dbtでtarget.nameに応じてgeneric testの実行有無を切り替える方法

[小ネタ]dbtでtarget.nameに応じてgeneric testの実行有無を切り替える方法

Clock Icon2025.01.13

さがらです。

dbtでtarget.nameに応じてgeneric testの実行有無を切り替える方法について、本記事でまとめます。

※実行有無についてはtagで切り替えることもできますが、dbtコマンドの実行時にtagの指定が必要だったり、tag自体の管理も煩雑になりやすいため、今回target.nameで切り替える方法を考えてみました。

方法

結論から入りますが、下記のようにconfig:enabled: "{{ target.name == 'prod' }}"enabled: "{{ target.name in ['prod', 'staging'] }}"のように記述すればOKです。

version: 2

models:
  - name: your_model
    columns:
      - name: id
        data_tests:
          - unique:
              config:
                enabled: "{{ target.name == 'prod' }}"
          - not_null:
              config:
                enabled: "{{ target.name in ['prod', 'staging'] }}"

ロジックとしては、enabled:という対象のリソースを有効にするか無効にするかを定義するconfigがあるため、これに対してJinjaでtarget.nameの値を用いたtrue/falseの判断をしているだけです。

https://docs.getdbt.com/reference/resource-configs/enabled

試してみた

dbt Cloudで、この記述を行った時にどのように挙動するかを見てみます。

dbt Cloudでのtargetの定義方法については、下記の記事が参考になると思います。

https://dev.classmethod.jp/articles/dbt-cloud-how-to-change-target/

targetの定義

dbt CloudのIDEのtargetを指定するDevelopment Credentialではdev、dbt CloudのJobのtargetではprod、と定義しておきます。

  • Development Credentialのtarget

2025-01-13_10h45_30

  • Jobのtarget

2025-01-13_10h47_47

yamlの定義

下記のように定義します。stg_ordersに対するaccepted_valuesのテストが、target.nameprodまたはstagingのときのみ動くような設定にしています。

version: 2

models:
  - name: customers
    description: 顧客情報をまとめたテーブル
    columns:
      - name: customer_id
        description: Primary key
        data_tests:
          - unique
          - not_null
      - name: first_order_date
        description: 顧客がまだ注文していない場合はNULL。(NULL when a customer has not yet placed an order)

  - name: stg_customers
    description: 元のcustomerテーブルを整えたテーブル。(This model cleans up customer data)
    columns:
      - name: customer_id
        description: Primary key
        data_tests:
          - unique
          - not_null

  - name: stg_orders
    description: 元のordetsテーブルを整えたテーブル。(This model cleans up order data)
    columns:
      - name: order_id
        description: Primary key
        data_tests:
          - unique
          - not_null
      - name: status
        data_tests:
          - accepted_values:
              values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
              config:
                enabled: "{{ target.name in ['prod', 'staging'] }}"

IDE(target.nameがdev)で実行

IDEでdbt buildを実行します。

stg_ordersに対するaccepted_valuesのテストが行われていないことがわかります。

2025-01-13_10h52_48

Job(target.nameがprod)で実行

targetをprodにしたJobで、dbt buildを実行コマンドとして定義して、Jobを実行してみます。

stg_ordersに対するaccepted_valuesのテストが行われていることがわかります。

2025-01-13_11h06_28

最後に

dbtでtarget.nameに応じてgeneric testの実行有無を切り替える方法についてまとめてみました。

dev・staging・prodといった各実行環境でdbt testの実行有無を切り替えたいケースはあると思いますので、その際に参考になると嬉しいです!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.